package com.yoki.cloud.common.model.exception.enums;

/**
 * 基础错误代码：100000--199999
 * Created by SunnyWen on 2017/10/19.
 */
public enum BasicRestStatus implements RestStatus {

    OK(20000, "请求成功"),
    OK_NO_DATA(20001, "请求数据为空"),


    BUSINESS_ERROR(40000, "业务错误!"),
    UNAUTHORIZED_ERROR(40001, "认证失败!"),
    FORBIDDEN(40003, "拒绝访问，无权操作!"),
    REQUEST_METHOD_ERROR(40004, "请求方式错误!"),
    // 成功接收请求, 但是处理失败
    DUPLICATE_KEY(40005, "操作过快, 请稍后再试"),

    /* ********************************************************************* */
    /* *****************************           ***************************** */
    /* *****************************    参数    ***************************** */
    /* *****************************           ***************************** */
    /* ********************************************************************* */
    /* 参数异常[基本]错误码值 40100 - 40109 */
    PARAM_NULL_ERROR(40100, "参数为空！"),
    PARAM_EMPTY_STRING_ERROR(40101, "参数为空字符！"),
    PARAM_VALIDATION_ERROR(40102, "参数校验错误！"),
    PARAM_OVER_LENGTH_ERROR(40103, "参数长度溢出！"),
    PARAM_LESS_MIN_LENGTH_ERROR(40104, "参数长度小于最小长度！"),
    PARAM_FORMAT_ERROR(40205, "参数格式错误！"),

    /* 参数异常[基本数据类型格式化]错误码值 40110 - 40129 */
    //参数类型非法，常见于SpringMVC中String无法找到对应的enum而抛出的异常
    PARAM_FORMAT_CHAR_ERROR(40110, "参数格式错误！应为字符格式！"),
    PARAM_FORMAT_BIT_ERROR(40111, "参数格式错误！应为比特格式！"),
    PARAM_FORMAT_NUMBER_ERROR(40112, "参数格式错误！应为数字格式！"),
    PARAM_FORMAT_STRING_ERROR(40113, "参数格式错误！应为字符串格式！"),
    PARAM_FORMAT_INTEGER_ERROR(40114, "参数格式错误！应为整型格式！"),
    PARAM_FORMAT_LONG_ERROR(40115, "参数格式错误！应为长整型格式！"),
    PARAM_FORMAT_FLOAT_ERROR(40116, "参数格式错误！应为浮点型格式！"),
    PARAM_FORMAT_DOUBLE_ERROR(40117, "参数格式错误！应为双精度浮点型格式！"),
    PARAM_FORMAT_DATE_ERROR(40118, "参数格式错误！应为日期格式！"),
    PARAM_FORMAT_BOOLEAN_ERROR(40119, "参数格式错误！应为布尔格式！"),

    /* 参数异常[基本数据类型校验]错误码值 40130 - 40159 */
    PARAM_VALIDATION_CHAR_ERROR(40130, "参数校验错误！应为字符类型！"),
    PARAM_VALIDATION_BIT_ERROR(40131, "参数校验错误！应为字节类型！"),
    PARAM_VALIDATION_NUMBER_ERROR(40132, "参数校验错误！应为数字类型！"),
    PARAM_VALIDATION_STRING_ERROR(40133, "参数校验错误！应为字符串类型！"),
    PARAM_VALIDATION_INTEGER_ERROR(40134, "参数校验错误！应为整型！"),
    PARAM_VALIDATION_LONG_ERROR(40135, "参数校验错误！应为长整型！"),
    PARAM_VALIDATION_FLOAT_ERROR(40136, "参数校验错误！应为浮点型！"),
    PARAM_VALIDATION_DOUBLE_ERROR(40137, "参数校验错误！应为双精度浮点型！"),
    PARAM_VALIDATION_DATE_ERROR(40138, "参数校验错误！应为日期类型！"),
    PARAM_VALIDATION_BOOLEAN_ERROR(40139, "参数校验错误！应为布尔类型！"),
    PARAM_VALIDATION_ENUM_ERROR(40140, "参数校验错误！应为枚举类型！"),
    PARAM_VALIDATION_OBJECT_ERROR(40141, "参数校验错误！应为Object类型！"),
    PARAM_VALIDATION_ARRAY_ERROR(40142, "参数校验错误！应为数组类型！"),
    PARAM_VALIDATION_LIST_ERROR(40143, "参数校验错误！应为list类型！"),
    PARAM_VALIDATION_MAP_ERROR(40144, "参数校验错误！应为map类型！"),

    /* 参数异常[自定义数据格式化]错误码值 40160 - 40199 */
    PARAM_FORMAT_ID_CARD_ERROR(40260, "参数格式错误！应为身份证格式！"),
    PARAM_FORMAT_URL_ERROR(40261, "参数格式错误！应为Url格式！"),
    PARAM_FORMAT_PHONE_ERROR(40262, "参数格式错误！应为电话号码格式！"),
    PARAM_FORMAT_EMAIL_ERROR(40263, "参数格式错误！应为电话号码格式！"),

    /* ********************************************************************* */
    /* *****************************           ***************************** */
    /* *****************************    数据    ***************************** */
    /* *****************************           ***************************** */
    /* ********************************************************************* */
    /* 数据异常[基本]错误码值 40200 - 40209 */
    DATA_NULL_ERROR(40200, "数据为空！"),
    DATA_REPEAT_ERROR(40201, "数据重复！"),
    DATA_STATUS_ERROR(40202, "数据状态错误！"),
    DATA_APPROVE_STATUS_ERROR(40203, "数据审批状态错误！"),

    /* 数据异常[重复数据]错误码值 40210 - 40229 */
    DATA_REPEAT_ID_ERROR(40211, "重复ID！"),
    DATA_REPEAT_NAME_ERROR(40221, "重复名称！"),
    DATA_REPEAT_CODE_ERROR(40231, "重复编码！"),

    /* 数据异常[错误状态]错误码值 40230 - 40249 */
    DATA_STATUS_LOCK_ERROR(40230, "数据状态错误!当前状态为锁定！"),
    DATA_STATUS_FREEZE_ERROR(40231, "数据状态错误！当前状态为冻结！"),
    DATA_STATUS_INIT_ERROR(40232, "数据状态错误！当前状态为初始！"),
    DATA_STATUS_OUT_ERROR(40233, "数据状态错误！当前状态为退出！"),
    DATA_STATUS_IN_ERROR(40234, "数据状态错误！当前状态为准入！"),
    DATA_STATUS_DELETE_ERROR(40235, "数据状态错误！当前状态为删除！"),

    /* 数据异常[错误审批]状态错误码值 40250 - 40279 */

    /* 数据异常[预留]错误码值 40280 - 40299 */

    /* ********************************************************************* */
    /* *****************************           ***************************** */
    /* *****************************    权限    ***************************** */
    /* *****************************           ***************************** */
    /* ********************************************************************* */

    /* 权限异常[登录账号]错误码值 40300 - 40319 */
    LOGIN_ERROR(40300, "登录错误,请检查后重新输入！"),
    LOGIN_ACCOUNT_ERROR(40301, "登录账号错误,请检查后重新输入！"),
    LOGIN_PASSWORD_ERROR(40302, "登录密码错误,请检查后重新输入！"),
    LOGIN_VERIFY_CODE_ERROR(40303, "登录验证码错误,请检查后重新输入！"),
    LOGIN_ACCOUNT_LOCK_ERROR(40304, "登录账号被锁定定,请联系管理员！"),
    LOGIN_MULTIPLE_ERROR(40305, "尝试登录失败多次错误！"),
    LOGIN_TOKEN_INVALID_ERROR(40306, "登录已失效！"),


    /* ********************************************************************* */
    /* *****************************           ***************************** */
    /* *****************************    系统    ***************************** */
    /* *****************************           ***************************** */
    /* ********************************************************************* */

    /* 系统异常[基本]错误码值 50000+ */
    SERVER_INTERNAL_ERROR(50000, "服务端异常, 请稍后再试"),
    ;

    private Integer code;

    private StringBuffer message;

    @Override
    public int code() {
        return code;
    }

    @Override
    public String message() {
        if (null == this.message) {
            return "";
        }
        return message.toString();
    }

    BasicRestStatus(Integer code, String message) {
        this.code = code;
        if (null == this.message) {
            this.message = new StringBuffer();
        }
        this.message.append(message);
    }

    public BasicRestStatus appendMessage(String message) {
        if (null == this.message) {
            this.message = new StringBuffer();
        }
        this.message.append(message);
        return this;
    }

}
